# 导入模块
import re
import random

# |  指明两项之间的一个选择。要匹配 |，请使用 \|。
print(re.search(r'dyl(b|a)', 'www.hellodylan.cn'))  # <re.Match object; span=(9, 13), match='dyla'>

# ^ 匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示取反。要匹配 ^ 字符本身，请使用 \^。
print(re.search(r'^www', 'www.hellodylan.cn'))  # <re.Match object; span=(0, 3), match='www'>
print(re.findall(r'[^www]', 'www.hellodylan.cn'))  # ['.', 'h', 'e', 'l', 'l', 'o', 'd', 'y', 'l', 'a', 'n', '.', 'c', 'n']

# $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。
print(re.search(r'cn$', 'www.hellodylan.cn'))  # <re.Match object; span=(15, 17), match='cn'>

# 找到所有匹配的元素，打包进一个列表中
print(re.findall(r'[b-d]', 'abcd'))  # ['b', 'c', 'd']

# * 	匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
# + 	匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
# ? 	匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
# 默认为贪婪模式，即尽可能多的匹配
print(re.search(r'hello+','helloo,python'))#<re.Match object; span=(0, 6), match='helloo'>
# 使用 *？ +？ ？？ 取消贪婪模式
print(re.search(r'hello*?','helloo,python'))#<re.Match object; span=(0, 4), match='hell'>
